package org.cybzacg.encryption.listener;

import org.cybzacg.encryption.context.EncryptionContext;
import org.cybzacg.encryption.model.EncryptionResult;

/**
 * 加密监听器接口
 * 用于监听加密操作的各种事件
 * 
 * @author encryption team
 * @version 1.0
 */
public interface EncryptionListener {
    
    /**
     * 加密开始事件
     * 
     * @param context 加密上下文
     */
    void onEncryptionStart(EncryptionContext context);
    
    /**
     * 加密成功事件
     * 
     * @param result 加密结果
     * @param context 加密上下文
     */
    void onEncryptionSuccess(EncryptionResult result, EncryptionContext context);
    
    /**
     * 加密失败事件
     * 
     * @param exception 异常信息
     * @param context 加密上下文
     */
    void onEncryptionFailure(Exception exception, EncryptionContext context);
    
    /**
     * 解密开始事件
     * 
     * @param context 解密上下文
     */
    void onDecryptionStart(EncryptionContext context);
    
    /**
     * 解密成功事件
     * 
     * @param result 解密结果
     * @param context 解密上下文
     */
    void onDecryptionSuccess(EncryptionResult result, EncryptionContext context);
    
    /**
     * 解密失败事件
     * 
     * @param exception 异常信息
     * @param context 解密上下文
     */
    void onDecryptionFailure(Exception exception, EncryptionContext context);
    
    /**
     * 验证开始事件
     * 
     * @param context 验证上下文
     */
    void onValidationStart(EncryptionContext context);
    
    /**
     * 验证成功事件
     * 
     * @param context 验证上下文
     */
    void onValidationSuccess(EncryptionContext context);
    
    /**
     * 验证失败事件
     * 
     * @param exception 异常信息
     * @param context 验证上下文
     */
    void onValidationFailure(Exception exception, EncryptionContext context);
    
    /**
     * 缓存命中事件
     * 
     * @param context 上下文
     */
    void onCacheHit(EncryptionContext context);
    
    /**
     * 缓存未命中事件
     * 
     * @param context 上下文
     */
    void onCacheMiss(EncryptionContext context);
    
    /**
     * 性能警告事件
     * 
     * @param duration 耗时（毫秒）
     * @param context 上下文
     */
    void onPerformanceWarning(long duration, EncryptionContext context);
    
    /**
     * 安全警告事件
     * 
     * @param warning 警告信息
     * @param context 上下文
     */
    void onSecurityWarning(String warning, EncryptionContext context);
    
    /**
     * 批处理开始事件
     * 
     * @param batchSize 批次大小
     * @param context 上下文
     */
    void onBatchStart(int batchSize, EncryptionContext context);
    
    /**
     * 批处理完成事件
     * 
     * @param processedCount 处理数量
     * @param successCount 成功数量
     * @param failureCount 失败数量
     * @param context 上下文
     */
    void onBatchComplete(int processedCount, int successCount, int failureCount, EncryptionContext context);
    
    /**
     * 获取监听器名称
     * 
     * @return 监听器名称
     */
    String getName();
    
    /**
     * 获取监听器优先级
     * 数值越小优先级越高
     * 
     * @return 优先级值
     */
    int getPriority();
    
    /**
     * 检查是否启用
     * 
     * @param context 上下文
     * @return 是否启用
     */
    default boolean isEnabled(EncryptionContext context) {
        return true;
    }
    
    /**
     * 初始化监听器
     * 
     * @param context 初始化上下文
     */
    default void initialize(EncryptionContext context) {
        // 默认实现为空，子类可以重写
    }
    
    /**
     * 清理监听器资源
     */
    default void cleanup() {
        // 默认实现为空，子类可以重写
    }
    
    /**
     * 获取监听器描述
     * 
     * @return 描述信息
     */
    default String getDescription() {
        return "Encryption listener for monitoring encryption operations";
    }
}
